#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define N 5
typedef void (*task)();
///////////////////////////////////////////////////////////////////
void download()
{
  printf("i am a process id: %d, task: download\n", getpid());
}

void prolog()
{
  printf("i am a process id: %d, task: log\n", getpid());
}

void other()
{
  printf("i am a process id: %d, task: other\n", getpid());
}
//////////////////////////////////////////////////////////////////

void task_t_init(task tasks[], int n)
{
  int i = 0;
  for(i = 0; i < n; i++)
  {
    tasks[i] = NULL;
  }
  printf("任务数组初始化成功\n");
}

void task_t_add(task tasks[], task t)
{
  int i = 0;
  while(i < N)
  {
    if(tasks[i] == NULL)
    {
      tasks[i] = t;
      printf("任务添加成功\n");
      break;
    }
    i++;
  }
}

void tasks_excu(task tasks[])
{
  int i = 0;
  for(i = 0; tasks[i] != NULL; i++)
  {
    task t = tasks[i];
    t();
  }
  printf("任务执行成功\n");
}
////////////////////////////////////////////////////////////////////////
void work()
{
  int cnt = 5;
  while(cnt--)
  printf("i am a child process, id: %d\n", getpid()), sleep(1);
}
int main()
{
  task task_t[N];
  task_t_init(task_t, N);
  task_t_add(task_t, download);
  task_t_add(task_t, prolog);
  task_t_add(task_t, other);

  int id = fork();
  if(id == 0)
  {
    work();
    exit(0);
  }

  while(1)
  {
    int rid = waitpid(-1, NULL, WNOHANG);
    if(rid == 0)
    {
      printf("------------------------------\n");
      printf("进程等待成功，子进程未结束，父进程执行其他任务，rid: %d\n", rid);
      tasks_excu(task_t);
      printf("------------------------------\n");
    }
    else
    {
      printf("###################################\n");
      printf("child wait secess rid: %d\n", rid);
      printf("###################################\n");
      break;
    }
    sleep(1);
  }

  return 0;
}

//void work()
//{
//  int i = 5;
//  while(i--)
//  {
//    printf("hello world\n");
//    sleep(1);
//  }
//}



//int main()
//{
//  int id = fork();//创建子进程
//  if(id == 0)
//  {
//    work();//子进程会进入这里执行work函数，五秒后，子进程退出
//    exit(0);
//  }
//  //为了等子进程结束，睡眠10秒，之后再回收这个进程
//  sleep(10);
//  pid_t wid = wait(NULL);
//  printf("I recycled a process with an ID of %d， my id is %d\n", wid, getpid());
//  sleep(2);
//  return 0;
//}



//void work()
//{
//  int i = 5;
//  while(i--)
//  {
//    printf("hello world，id：%d\n", getpid());
//    sleep(1);
//  }
//}
//
//
//int main()
//{
//  int id = fork();//创建子进程
//  if(id == 0)
//  {
//    work();//子进程会进入这里执行work函数，五秒后，子进程退出
//    exit(10);
//  }
//  printf("before\n");
//  int status = 0;
//  pid_t wid = waitpid(0, &status, WNOHANG);
//  if(WIFEXITED(status))
//    printf("I recycled a process with an ID of %d， my id is %d, Exit Code：%d\n", wid, getpid(), WEXITSTATUS(status));
//  printf("after\n");
//  return 0;
//}



//void work(int num)
//{
//  int i = 5;
//  while(i--)
//  {
//    printf("我是一个子进程，我的id是：%d，我的ppid是：%d，编号：%d\n", getpid(), getppid(), num);
//    sleep(1);
//  }
//}
//
//void creatprocess(int n)
//{
//  int i = 0;
//  for(i = 0; i < n; i++)
//  {
//    int id = fork();
//    if(id == 0)
//    {
//      work(i);
//      exit(0);
//    }
//  }
//}
//
//int main()
//{
//  creatprocess(5);
//
//  sleep(10);
//  int i = 0;
//  for(i = 0; i < 5; i++)
//  {
//    int wid = waitpid(-1, NULL, 0);
//    printf("回收一个子进程，id：%d\n", wid);
//  }
//  sleep(2);
//  return 0;
//}



//int main()
//{
//  printf("hello world");
//  //exit(0);
//  _exit(0);
//  //return 0;
//}
